/**
 * 并发执行多个任务；
 * @param tasks 任务数组
 * @param parallelCount 一次并发执行的任务数量
 * @returns
 */
export function parallelTasks(tasks: Function[], parallelCount = 10) {
  // 返回一个Promise对象
  return new Promise((resolve) => {
    // 如果任务数组为空，则直接resolve
    if (tasks.length === 0) {
      //@ts-ignore
      resolve()
      return
    }
    // 初始化下一个任务的索引和已完成任务的数量
    let nextIndex = 0,
      finishedCount = 0
    // 定义一个内部函数，用于执行任务
    function _run() {
      // 获取下一个任务
      const task = tasks[nextIndex]
      // 索引自增
      nextIndex++
      // 执行任务，并在任务完成后执行回调函数
      task().then(() => {
        // 已完成任务数量自增
        finishedCount++
        // 如果还有未执行的任务，则继续执行下一个任务
        if (nextIndex < tasks.length) {
          _run()
          // 如果所有任务都已完成，则resolve
        } else if (finishedCount === tasks.length) {
          //@ts-ignore
          resolve()
        }
      })
    }
    // 循环执行任务，直到达到并行数量或任务数组为空
    for (let i = 0; i < parallelCount && i < tasks.length; i++) {
      _run()
    }
  })
}
